# 列表推导式
# 官方网址 https://docs.python.org/zh-cn/3/tutorial/datastructures.html#list-comprehensions

# 一，基本的列表推导式使用方式
# 变量=[变量或变量的处理结果 for 变量 in 容器类型数据]
varlist = []
# 为varlist添加元素为0~9的平方，输出结果为[0，1,4，9，16，25，36,49，64，81]，
# 方法一：使用普通方法完成
for i in range(10):
    varlist.append(i * i)
print(varlist)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 方法二：使用map函数lambda和list完成，也可以用lambda
varlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


def square(x):
    return x * x


varlist = list(map(square, varlist))
print(varlist)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 方法三：使用列表推导式完成
varlist = [i * i for i in range(10)]
print(varlist)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

varlist.clear()
# 需求,'1234'==>[2,4,6,8]
# 方法一：使用普通方法完成
for i in '1234':
    varlist.append(int(i) * 2)
print(varlist)  # [2, 4, 6, 8]


# 方法二：使用map函数lambda和list完成，也可以用lambda
def multi(x):
    return int(x) * 2


varlist = list(map(multi, '1234'))
print(varlist)  # [2, 4, 6, 8]

# 方法三：使用列表推导式完成
varlist = [int(x) * 2 for x in '1234']
print(varlist)  # [2, 4, 6, 8]

varlist.clear()
# 二，带有判断条件的列表推导式

# 需求：0-9求所有的偶数，==>[0，2，4，6，8]

# 方法一：常规方法
for i in range(10):
    if i % 2 == 0:
        varlist.append(i)
print(varlist)  # [0, 2, 4, 6, 8]
varlist.clear()
# 方法二：列表推导式完成
varlist = [x for x in range(0, 10) if x % 2 == 0]
print(varlist)
varlist.clear()  # [0, 2, 4, 6, 8]

# 三，带有条件判断的多循环的推导式
# [1,2,3],[3,1,4] ==>把两个列表中的元素两两组合，要求组合的元素不能重复
# [(1，3)，(1,4)，(2，3)，(2，1)，(2，4)，(3,1)，(3，4)]

# 方法一：常规方法
list1 = [1, 2, 3]
list2 = [3, 1, 4]
result = []
for i in list1:
    for j in list2:
        if i != j:
            result.append((i, j))
print(result)  # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
result.clear()
# 方法二：列表推导式完成
result = [(i, j) for i in list1 for j in list2 if i != j]
print(result)  # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
# 四、 对于嵌套循环的列表推导式
"""
#下面这个3x4的矩阵，它由3个长度为4的列表组成，交换其行和列
[
    [1,2，3，4],
    [5，6，7，8],
    [9，10，11,12]，
]
"""
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]
result = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]
# 方法一：常规方法
for i in range(3):
    for j in range(4):
        result[j][i] = matrix[i][j]
print(result)
# 方法二：列表推导式完成
